package itheima05;

import java.util.*;

/*
    斗地主综合案例: 看牌按照从小到大的顺序

        抽取方法的快捷键: ctrl+alt+m

        思考:
            定义一个玩家类Player
            成员变量:
                List<Integer> list: 存储玩家拿到的牌的编号的List集合
                String playerName: 玩家的名字

 */
public class PokerGameBetter {
    public static void main(String[] args) {

        //准备牌
        Map<Integer, String> pokers = getPokers();

        //洗牌
        List<Integer> list = shufflePokers(pokers);

        //发牌
        List<Player> players = sendPokers(list);

        //四: 看牌
        lookPokers(players,pokers);
    }

    //发牌
    public static List<Player> sendPokers(List<Integer> list) {
        //创建存储4个玩家的List集合对象
        List<Player> players = new ArrayList<>();
        //三: 发牌
        //1.创建4个List集合对象,泛型:Integer(发的是扑克的编号) ,分别代表3个玩家和1个底牌
        Player p1 = new Player("宝强");
        Player p2 = new Player("金莲");
        Player p3 = new Player("哲哲");
        Player bottom = new Player("底牌");

        //2.因为要根据索引%3的结果,决定发给不同的玩家
        //所以只能使用for + get(索引) 遍历 存储54张扑克编号的List集合
        for(int i = 0;i<list.size();i++) {
            //3.获取当前扑克的编号
            int num = list.get(i);
            //4.根据索引值,把编号发给不同的玩家
            if(i>50) {
                //留作底牌
                bottom.getList().add(num);
            } else {
                if(i%3==0) {
                    //发给玩家一
                    p1.getList().add(num);
                } else if(i%3==1) {
                    //发给玩家二
                    p2.getList().add(num);
                } else {
                    //发给玩家三
                    p3.getList().add(num);
                }
            }

        }
        //把4个玩家,添加到List集合对象中
        players.add(p1);
        players.add(p2);
        players.add(p3);
        players.add(bottom);
        return players;
    }

    private static List<Integer> shufflePokers(Map<Integer, String> pokers) {
        //9.打印
        //System.out.println(pokers);
        //System.out.println(pokers.size());

        //二: 洗牌
        //1.获取存储54张扑克的Map集合的所有的键对应的Set集合
        Set<Integer> set = pokers.keySet();

        //2.把Set集合转换成List集合(addAll方法/构造方法)
        List<Integer> list = new ArrayList<>(set);

        //3.Collections工具类调用shuffle方法,打乱List集合(存储54张牌的编号)的顺序
        Collections.shuffle(list);
        return list;
    }

    private static Map<Integer, String> getPokers() {
        //一: 准备牌
        //1.创建Map集合对象pokers,存储54张扑克,键: Integer(扑克编号) 值: String(扑克)
        Map<Integer,String> pokers = new HashMap<>();

        //2.创建2个List集合对象colors和nums,用来存储花色和数字
        List<String> colors = new ArrayList<>();
        List<String> nums = new ArrayList<>();

        //3.向List集合对象colors中存储花色
        Collections.addAll(colors,"♥","♠","♣","♦");

        //4.向List集合对象nums中存储数字
        Collections.addAll(nums,"3-4-5-6-7-8-9-10-J-Q-K-A-2".split("-"));

        //定义int变量,代表扑克编号
        int index = 0;

        //5.循环嵌套遍历存储花色和数字的集合对象
        for (String num : nums) {
            for (String color : colors) {
                //6.拼接处一张扑克
                String poker = color + num;
                //7.编号和扑克存储到牌盒pokers中
                pokers.put(index,poker);
                //给下一张扑克做准备
                index++;
            }
        }
        //8.存储小王和大王
        pokers.put(index++,"小王");
        pokers.put(index,"大王");
        return pokers;
    }

    /*
        定义看牌的方法
            三要素:
                1.方法名称: lookPokers
                2.返回值类型: void
                3.参数列表:
                    (1)String playerName: 玩家的名字
                    (2)List<Integer> list: 玩家存储扑克编号的List集合
                    (3)Map<Integer,String> pokers: 存储54张扑克的Map集合对象

            步骤:
                0.打印玩家名称
                1.Collections静态方法sort对玩家手里的扑克编号List集合对象,进行排序
                2.遍历List集合对象
                3.获取当前的编号
                4.Map集合对象调用get方法,传递当前的编号,获取对应的值(扑克)
                5.打印扑克
     */
    public static void lookPokers(List<Player> players,Map<Integer,String> pokers) {
        //遍历
        for (Player player : players) {
            //0.打印玩家名称
            System.out.print(player.getPlayerName()+": [ ");
            //1.Collections静态方法sort对玩家手里的扑克编号List集合对象,进行排序
            Collections.sort(player.getList());

            //2.遍历List集合对象
            for (int num : player.getList()) {
                //3.获取当前的编号: num
                //4.Map集合对象调用get方法,传递当前的编号,获取对应的值(扑克)
                String poker = pokers.get(num);
                //5.打印扑克
                System.out.print(poker+" ");
            }
            System.out.println("]");
        }
    }
}
